<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="zA1xF" id="zA1xF"><span data-lake-id="uba64637f" id="uba64637f">典型问题</span></h1>
  <p data-lake-id="uc13152e9" id="uc13152e9"><br></p>
  <p data-lake-id="u782a54d5" id="u782a54d5"><span data-lake-id="u297b68a0" id="u297b68a0">在解决多线程的问题的时候，锁是最常用的方案，但是也是开销最大的一种方案，同时也会带来死锁的问题，所以，Netty为了避免这些问题引入了无锁化设计。</span></p>
  <p data-lake-id="uf0abb8e5" id="uf0abb8e5"><span data-lake-id="u4a0714b0" id="u4a0714b0">​</span><br></p>
  <p data-lake-id="u277082cd" id="u277082cd"><span data-lake-id="u65669093" id="u65669093">那么，不用锁的话，怎么解决并发的问题呢，Netty主要做了以下几个事情：</span></p>
  <p data-lake-id="u9232a4a3" id="u9232a4a3"><span data-lake-id="uda7b9d7f" id="uda7b9d7f">​</span><br></p>
  <p data-lake-id="u044b5ab3" id="u044b5ab3"><span data-lake-id="u226c8433" id="u226c8433">首先，Netty基于</span><strong><span data-lake-id="u52af5b1c" id="u52af5b1c">Reactor线程模式</span></strong><span data-lake-id="ua96b26d4" id="ua96b26d4">实现并发请求处理，避免了线程阻塞与锁的竞争。</span></p>
  <p data-lake-id="ua854d7f5" id="ua854d7f5"><span data-lake-id="u1976b44e" id="u1976b44e">​</span><br></p>
  <p data-lake-id="u9a841ec6" id="u9a841ec6"><span data-lake-id="uc2d972f7" id="uc2d972f7">​</span><br></p>
  <p data-lake-id="uac7ad8ff" id="uac7ad8ff"><span data-lake-id="u143725fa" id="u143725fa">其次，Netty实现了</span><strong><span data-lake-id="uc879a96a" id="uc879a96a">对象池</span></strong><span data-lake-id="ud10671e8" id="ud10671e8">，用来减少对象的创建和销毁，从而也能避免了锁的竞争。</span></p>
  <p data-lake-id="u0dbcf2ea" id="u0dbcf2ea"><span data-lake-id="u876617ed" id="u876617ed">​</span><br></p>
  <p data-lake-id="u1359a738" id="u1359a738"><span data-lake-id="u207a292a" id="u207a292a">​</span><br></p>
  <p data-lake-id="ua92b316d" id="ua92b316d"><span data-lake-id="u45ff0b50" id="u45ff0b50">而且在Netty中，还有许多组件都被设计为线程安全的，</span><strong><span data-lake-id="ub15a4a1e" id="ub15a4a1e">例如，每个Channel都有一个唯一的EventLoop</span></strong><span data-lake-id="ueaf24c01" id="ueaf24c01">，用于处理所有事件。这样可以避免锁竞争和线程切换带来的开销。</span></p>
 </body>
</html>